package com.acxy.ants.core.plugin.ehcache;

import com.acxy.ants.core.Const;
import com.acxy.ants.core.Plugin;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.config.Configuration;

/**
 * @author MrShun
 * @version 1.0
 * @Date 2017-05-14
 */
public class EhcachePlugin implements Plugin{

    //默认缓存名称
    private String defaultCacheName = Const.DEFAULT_CACHE_NAME;

    //缓存中允许创建的最大对象数
    private long maxElementsInMemory = 10000;

    //缓存中对象是否为永久的，如果是，超时设置将被忽略，对象从不过期。
    private boolean eternal = false;

    //缓存数据的钝化时间，也就是在一个元素消亡之前，两次访问时间的最大时间间隔值，这只能在元素不是永久驻留时有效，如果该值是 0 就意味着元素可以停顿无穷长的时间。
    private long timeToIdleSeconds = 300;

    //缓存数据的生存时间，也就是一个元素从构建到消亡的最大时间间隔值，这只能在元素不是永久驻留时有效，如果该值是0就意味着元素可以停顿无穷长的时间。
    private long timeToLiveSeconds = 600;

    //内存不足时，是否启用磁盘缓存。
    private boolean overflowToDisk = true;

    //缓存满了之后的淘汰算法。LRU和FIFO算法这里就不做介绍。LFU算法直接淘汰使用比较少的对象，在内存保留的都是一些经常访问的对象。对于大部分网站项目，该算法比较适用。
    private String memoryStoreEvictionPolicy = "LFU";


    private static CacheManager cacheManager;

    public EhcachePlugin(String configPath){
       cacheManager = CacheManager.create(Thread.currentThread().getContextClassLoader().getResourceAsStream(configPath));
    }

    public EhcachePlugin(){
        CacheConfiguration cacheConfiguration = new CacheConfiguration();
        cacheConfiguration.setName(defaultCacheName);
        cacheConfiguration.setMaxEntriesLocalHeap(maxElementsInMemory);
        cacheConfiguration.setEternal(eternal);
        cacheConfiguration.setTimeToIdleSeconds(timeToIdleSeconds);
        cacheConfiguration.setTimeToLiveSeconds(timeToLiveSeconds);
        cacheConfiguration.setOverflowToDisk(overflowToDisk);
        cacheConfiguration.setMemoryStoreEvictionPolicy(memoryStoreEvictionPolicy);

        Configuration configuration = new Configuration();
        configuration.addCache(cacheConfiguration);
        configuration.setUpdateCheck(false);
        cacheManager = CacheManager.create(configuration);
    }

    public EhcachePlugin(CacheConfiguration... configs){
        Configuration configuration = new Configuration();
        configuration.setUpdateCheck(false);
        for (CacheConfiguration config: configs) {
            configuration.addCache(config);
        }
        cacheManager = CacheManager.create(configuration);
    }


    @Override
    public boolean start() {
        if(cacheManager == null)
            return false;
        CacheKit.cacheManager = cacheManager;
        return true;
    }

    public static CacheManager getCacheManager() {
        return cacheManager;
    }

    @Override
    public boolean destroy() {
        return true;
    }
}
